From d3d49ce7f1c2ddd37fab507d5b3b479a6fc232ff Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Mar 2021 16:13:46 -0500 Subject: [PATCH] iconbrowser: fix search<>category interaction Make search act like a separate, filtered view of all icons. This is how it worked in gtk3, and how it should be. Fixes: #3717 --- demos/icon-browser/iconbrowserwin.c | 29 +++++++++++++++++++++ demos/icon-browser/window.ui | 39 +++++++++++++++++++---------- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/demos/icon-browser/iconbrowserwin.c b/demos/icon-browser/iconbrowserwin.c index 11c9c53234..4dbc054057 100644 --- a/demos/icon-browser/iconbrowserwin.c +++ b/demos/icon-browser/iconbrowserwin.c @@ -14,8 +14,10 @@ struct _IconBrowserWindow GtkWidget *searchbar; GListModel *icon_filter_model; GListStore *icon_store; + GListModel *context_model; GListStore *context_store; GtkFilter *name_filter; + GtkFilter *search_mode_filter; GtkWidget *details; GtkWidget *image1; GtkWidget *image2; @@ -354,6 +356,28 @@ setup_scalable_image_dnd (GtkWidget *image) gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (source)); } +static void +search_mode_toggled (GtkSearchBar *searchbar, + GParamSpec *pspec, + IconBrowserWindow *win) +{ + if (gtk_search_bar_get_search_mode (searchbar)) + gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (win->context_model), GTK_INVALID_LIST_POSITION); + else if (gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (win->context_model)) == GTK_INVALID_LIST_POSITION) + gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (win->context_model), 0); + + gtk_filter_changed (win->search_mode_filter, GTK_FILTER_CHANGE_DIFFERENT); +} + +static void +selected_name_changed (GtkSingleSelection *selection, + GParamSpec *pspec, + IconBrowserWindow *win) +{ + if (gtk_single_selection_get_selected (selection) != GTK_INVALID_LIST_POSITION) + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (win->searchbar), FALSE); +} + static void icon_browser_window_init (IconBrowserWindow *win) { @@ -380,6 +404,9 @@ icon_browser_window_init (IconBrowserWindow *win) win->name_filter = GTK_FILTER (gtk_custom_filter_new (filter_by_icon_name, NULL, NULL)); gtk_multi_filter_append (GTK_MULTI_FILTER (filter), g_object_ref (win->name_filter)); + + g_signal_connect (win->searchbar, "notify::search-mode-enabled", G_CALLBACK (search_mode_toggled), win); + g_signal_connect (win->context_model, "notify::selected", G_CALLBACK (selected_name_changed), win); } static void @@ -409,6 +436,7 @@ icon_browser_window_class_init (IconBrowserWindowClass *class) gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, searchbar); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, icon_store); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, icon_filter_model); + gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, context_model); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, context_store); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, details); @@ -422,6 +450,7 @@ icon_browser_window_class_init (IconBrowserWindowClass *class) gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, image8); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, label8); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, description); + gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, search_mode_filter); gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), item_activated); gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), copy_to_clipboard); diff --git a/demos/icon-browser/window.ui b/demos/icon-browser/window.ui index 59685dbb57..17d745c218 100644 --- a/demos/icon-browser/window.ui +++ b/demos/icon-browser/window.ui @@ -151,19 +151,32 @@ - - 0 - exact - - - - - - - context_model - - - + + + + + + searchbar + + + + + + + 0 + exact + + + + + + + context_model + + + + + -- 2.30.2